package cn.kogee.basic.service.impl;

import cn.kogee.basic.constants.VerifyCodeConstants;
import cn.kogee.basic.dto.BinderSmsDto;
import cn.kogee.basic.dto.SsmDto;
import cn.kogee.basic.exception.BusinessException;
import cn.kogee.basic.service.IVerifyImageService;
import cn.kogee.basic.util.StrUtils;
import cn.kogee.basic.util.VerifyCodeUtils;
import cn.kogee.user.domain.User;
import cn.kogee.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

@Service
public class VerifyImageServiceImpl implements IVerifyImageService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserMapper userMapper;
    /**
     * 图形验证码
     * @param key
     * @return
     */
    @Override
    public String Verification(String key) {
        //1.调用StrUtils生成随机的4位字符
        String code = StrUtils.getComplexRandomString(4);
        //2.将随机生成的字符保存到redis中
        redisTemplate.opsForValue().set(key,code,3, TimeUnit.MINUTES);
        //3.生成图形码返回给前端
        String verifyCode = VerifyCodeUtils.verifyCode(115, 50, code);
        return verifyCode;
    }

    /**
     * 短信验证码
     * @param dto
     */
    @Override
    public void smsCode(SsmDto dto) {
        //非空校验
        String phone = dto.getPhone();
        String imageCode = dto.getImageCode();
        String imageCodeKey = dto.getImageCodeKey();
        //图形验证码校验
        //获取存入到redis中的图形验证码
        Object imagObj = redisTemplate.opsForValue().get(imageCodeKey);
        //校验图形验证码是否过期
        if(imagObj==null){
            throw  new BusinessException("图形验证码过期");

        }
        //校验用户输入图形验证码是否正确
        if(!imagObj.toString().equalsIgnoreCase(imageCode)){
            throw  new BusinessException("验证码输入不正确");
        }
        //手机注册校验
        User user = userMapper.loadByPhone(phone);
        if(user!=null){
            throw  new BusinessException("该手机号已经被注册");
        }

        //存入redis的key用手机号：register的形式
        String key= VerifyCodeConstants.REGISTER_CODE_PREFIX+phone;
        String ssmcode=null;
        //通过key从redis中获取验证码ssmcode
        Object codeObj = redisTemplate.opsForValue().get(key);
        //如果不存在则说明过期
        if(codeObj==null){
            //已经过期重新生成ssmcode
            ssmcode = StrUtils.getRandomString(4);

        }else {
            //存在则判断时间是否超过一分钟
            String time = codeObj.toString().split(":")[1];
            //转为long格式
            long nowTime = System.currentTimeMillis();
            long oldTime = Long.parseLong(time);
            //没有超过一分钟验证码时间
            if(nowTime-oldTime<1*60*1000){
                throw  new BusinessException("操作频繁请稍后重试");

            }else {
                //超过一分钟将原验证码重新获取并发送给用户
                 ssmcode = codeObj.toString().split(":")[0];
            }
        }
        //将验证码存入redis
        redisTemplate.opsForValue().set(key,ssmcode+":"+System.currentTimeMillis(),3,TimeUnit.MINUTES);
        //验证码发送给用户
        /*SmsUtils.sendSms(phone,"您的短信验证码为"+ssmcode+"请在三分钟内使用");*/
        System.out.println("您的短信验证码为"+ssmcode+"请在三分钟内使用");
    }

    /**
     * 微信绑定需要的验证码
     * @param dto
     */
    @Override
    public void binderLogin(BinderSmsDto dto) {
        String phone = dto.getPhone();
        //非空校验
        if(StringUtils.isEmpty(phone)){
            throw new BusinessException("手机号码不能为空！！");
        }
        //手机号注册校验
        User user = userMapper.loadByPhone(phone);
        if(user!=null){
            throw new BusinessException("该手机号已经被绑定");
        }
        //redis中获取验证码
        String ssmCode=null;
        Object object = redisTemplate.opsForValue().get(VerifyCodeConstants.WXREGISTER_CODE_PREFIX + phone);
        if(object==null){
            //如果获取不到相关验证码则重新生成
            ssmCode = StrUtils.getRandomString(4);
        }else {
            //如果能获取到则需要判断有效时间
            String time = object.toString().split(":")[1];
            //获取现在时间
            long nowTime = System.currentTimeMillis();
            //转换时间格式
            long oldTime = Long.parseLong(time);
            if(nowTime-oldTime<1*60*1000){
                //如果发送短信验证码的时间没有超过一分钟则向前端保存
                throw new BusinessException("操作频繁请稍后重试");
            }else {
                //重新从object中获取验证码
                ssmCode = object.toString().split(":")[0];
            }
        }
        //将验证码存入redis并设置时间戳
        redisTemplate.opsForValue().set(VerifyCodeConstants.WXREGISTER_CODE_PREFIX+phone,
                ssmCode+":"+System.currentTimeMillis(),3,TimeUnit.MINUTES);
        //发送验证码给用户
        /*SmsUtils.sendSms(phone,"您的短信验证码为"+ssmcode+"请在三分钟内使用");*/
        System.out.println("您的短信验证码为"+ssmCode+"请在三分钟内使用");
    }

    /**
     * 邮箱验证码
     * @param key
     * @return
     */
    @Override
    public String EmailVerification(String key) {
        //1.调用StrUtils生成随机的4位字符
        String code = StrUtils.getComplexRandomString(4);
        //2.将随机生成的字符保存到redis中
        redisTemplate.opsForValue().set(key,code,3, TimeUnit.MINUTES);
        //3.生成图形码返回给前端
        String verifyCode = VerifyCodeUtils.verifyCode(115, 50, code);
        return verifyCode;
    }
}
